package game.view;

import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JPanel;

import game.model.Block;
import game.model.Board;

/**
 * 游戏棋盘绘制，继承 JPanel 类
 * 
 * @author 陈渤林
 *
 */
@SuppressWarnings("serial")
class BoardView extends JPanel {
	private static final int CHECK_GAP = 10;
	private static final int CHECK_ARC = 20;
	private static final int CHECK_SIZE = 86;

	private Board board;

	/**
	 * 构造函数，需要传入对应棋盘
	 * 
	 * @param board 对应棋盘
	 */
	public BoardView(Board board) {
		this.board = board;
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		for (int i = 0; i < this.board.getWidth(); i++) {
			for (int j = 0; j < this.board.getHeight(); j++) {
				drawCheck(g, i, j);
			}
		}

//		// GameOver
//		if (judgeGameOver()) {
//			g.setColor(new Color(64, 64, 64, 150));
//			g.fillRect(0, 0, getWidth(), getHeight());
//			g.setColor(Color.WHITE);
//			g.setFont(BasicData.topicFont);
//			FontMetrics fms = getFontMetrics(BasicData.topicFont);
//			String value = "Game Over!";
//			g.drawString(value, (getWidth() - fms.stringWidth(value)) / 2, getHeight() / 2);
//		}
	}

	// 绘制界面 (x, y) 处的方格，y 轴是朝下的，所以取方块时要注意变换 y 轴
	private void drawCheck(Graphics g, int x, int y) {

		// Graphics2D 类扩展了 Graphics 类，
		// 提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
		Graphics2D g2d = (Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);

		// 开始绘制
		Block block = this.board.getBlock(x, this.board.getHeight() - 1 - y);
		// 绘制方块及其背景
		g2d.setColor(BasicParameters.getBackground(block));
		// 绘制圆角
		// x - 要填充矩形的 x 坐标。
		// y - 要填充矩形的 y 坐标。
		// width - 要填充矩形的宽度。
		// height - 要填充矩形的高度。
		// arcwidth - 4 个角弧度的水平直径。
		// archeight - 4 个角弧度的垂直直径。
		g2d.fillRoundRect(CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * x, CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * y,
				CHECK_SIZE, CHECK_SIZE, CHECK_ARC, CHECK_ARC);

		// 绘制数字
		if (block == null)
			return;
		g2d.setColor(BasicParameters.getForeground(block));
		g2d.setFont(BasicParameters.getBlockFont(block));
		// 对文字的长宽高测量。
		FontMetrics fms = getFontMetrics(BasicParameters.getBlockFont(block));
		String value = String.valueOf(block.getNumber());
		// 使用此图形上下文的当前颜色绘制由指定迭代器给定的文本。
		// getAscent()是FontMetrics中的一个方法，
		// 它返回某字体的基线(baseline)到该字体中大多数字符的升部(ascender)之间的距离
		// getDescent 为降部
		g2d.drawString(value, CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * x + (CHECK_SIZE - fms.stringWidth(value)) / 2,
				CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * y + (CHECK_SIZE - fms.getAscent() - fms.getDescent()) / 2
						+ fms.getAscent());
	}

}